const fs = require("fs");
const axios = require("axios");
const chalk = require("chalk");
const { exec } = require("child_process");
// 入参数组
const args = process.argv.slice(2);
// 打包的模板编号
const templateId = args[0];
// 参数原封不动带给exec
const argsStr = args.join(" ");
// 同步远程文件环境
const upLoadEvn = args[2].length === 1 ? `pl4${args[2]}` : args[2];
// 压缩工具文件的名称
const zipName = "zip.exe";
// 同步工具文件的名称
const syncToolName = "autoZipNode.js";
// 打包工具文件的名称,方便本地功能调试
const execFileName =
  templateId === "autoZipNode" ? "_autoZipNode.real.js" : "autoZipNode.real.js";

// 我先更新我自己
getEnvFile(syncToolName)
  .then(_ => {
    // 当前项目没有zip.exe,下一个到本地
    return !fs.existsSync(zipName) && getEnvFile(zipName);
  })
  .then(_ => {
    // 下载工具包autoZipNode.real.js文件
    return getEnvFile(execFileName);
  })
  .then(_ => {
    // 开始打包
    console.log("\n...开始执行打包...");
    return execFile();
  })
  .catch(err => console.log("err:", err));

// 远程同步文件
function getEnvFile(filename) {
  return new Promise((resolve, reject) => {
    const getEnvFilePath = `http://128.192.190.161/ccbact-${upLoadEvn}/autoZipNode/${filename.replace(
      "_",
      ""
    )}`;
    console.log(`正在更新${upLoadEvn}环境${filename}到本地...`);
    axios({
      method: "get",
      url: getEnvFilePath,
      responseType: "arraybuffer",
    }).then(
      res => {
        fs.writeFileSync(filename, res.data);
        resolve(console.log(`更新成功`));
      },
      err => reject(err)
    );
  });
}

// 执行打包命令
function execFile() {
  const child_process = exec(`node ${execFileName} ${argsStr}`, error => {
    error && console.log(`执行文件失败:${error}`);
    if (fs.existsSync(execFileName)) {
      console.log(`打包工具文件${execFileName}已清理`);
      fs.unlinkSync(execFileName);
    }
  });

  child_process.stdout.on("data", data => {
    const resolveData = data.toString().replace(/\n$/g, "");

    const styleResolveObj = {
      "-------": chalk.blue.bold,
      "模板编号:": chalk.blue.bold,
      已完成操作: chalk.red.bold,
      已将: chalk.red.bold,
    };

    const matchItem = Object.keys(styleResolveObj).find(item =>
      new RegExp(item).test(resolveData)
    );
    console.log(
      matchItem ? styleResolveObj[matchItem](resolveData) : resolveData
    );
  });
}
